package model

import (
	"gorm.io/gorm"
	"shopping/utils/hash"
)

type User struct {
	BaseModel
	// 用户名
	Username string `gorm:"type:varchar(30)" json:"username"`
	// 密码
	Password  string `gorm:"type:varchar(100)" json:"password"`
	Password2 string `gorm:"-" json:"password2"`
	// 盐值
	Salt string `gorm:"type:varchar(100)" json:"salt"`
	// token
	Token string `gorm:"type:varchar(500)" json:"token"`
	// 是否是管理员
	IsAdmin bool `json:"isAdmin"`
}

// TableName 声明表名
func (User) TableName() string {
	return "shopping_user"
}

// NewUser 新建用户实例
func NewUser(username, password, password2 string) *User {
	return &User{
		Username:  username,
		Password:  password,
		Password2: password2,
		BaseModel: BaseModel{DelFlag: 0},
		IsAdmin:   false,
	}
}

// BeforeSave 保存用户数据之前的钩子函数, 如果没有盐值, 则会生成盐值, 并且给密码加密
func (user *User) BeforeSave(tx *gorm.DB) (err error) {
	if user.Salt == "" {
		// 为salt创建一个随机字符串
		salt := hash.CreateSalt()
		// 创建hash加密密码
		hashPassword, err := hash.HashPassword(user.Password + salt)
		if err != nil {
			return err
		}
		// 设置加密后的密码和盐值
		user.Password = hashPassword
		user.Salt = salt
	}
	return nil
}
